#ifndef __PTHREAD_POOL_H__
#define __PTHREAD_POOL_H__

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <stdbool.h>

#include "tcp_server.h"

#define PTHREAD_MAX_NUM 1000 // 线程池最大线程数

typedef struct client_node *P_CN;

// 存放线程任务的队列
typedef struct Pthread_Task_Queue
{
    void *(*Task)(void *arg); // 任务函数
    char work_refer[50];      // 任务描述
    P_CN client_node;
    struct Pthread_Task_Queue *next;

} Task_Node, *Task_Link;

// 线程池信息
typedef struct pthread_pool_inf
{
    pthread_t pid[PTHREAD_MAX_NUM]; // 劳动线程
    pthread_t monitor_pid;          // 监工线程

    pthread_cond_t cond;  // 条件变量
    pthread_mutex_t mute; // 互斥锁

    // 提供给监工显示实时输出监视的数据
    unsigned int task_sum;      // 任务总数
    unsigned int pthread_sum;   // 线程总数
    unsigned int working_num;   // 工作线程数
    unsigned int sleepping_num; // 休眠线程数
    unsigned int running_num;   // 醒的线程数

    // 摧毁线程池标志位
    int destory_mask;

    Task_Link task_head; // 任务队列头

} SPI, *P_SPI;

// 线程池初始化 --- 创建线程
P_SPI Pthread_Pool_Init();
Task_Link Create_Task_Node();         // 创建任务结点
void *Pthread_Pool_Manage(void *arg); // 线程池管理函数
void *Monitor_Task(void *arg);        // 监工线程任务函数
Task_Link Get_Task(Task_Link task_head);
// bool Add_Task(P_SPI p_spi);                                        // 线程池投递任务函数
bool Add_Task_Node(P_SPI p_spi, char *task_refer,P_CN client_node); // 添加任务结点到链表
void *Task(void *arg);                                             // 任务函数
bool Wake_Up_Pthread(P_SPI p_spi);                                 // 唤醒线程
bool Pthread_Pool_Free(P_SPI p_spi);                               // 线程池摧毁

void clinet_connect(P_CN client_node);
void client_msg_handle(P_CN client_node,char *msg);


#endif